在前一天的文章中我們透過密碼學的角度,簡單講解了 QUIC 在 Handshake 時交換金鑰的流程,今天我們要以封包的角度探討在 Client 端與 Server 端連線時雙方的封包交換流程,我們會用 wireshark 來撈封包,並且觀察其行為。
首先先安裝 wireshark
,筆者用的 ubuntu22.04 好像沒有內建,需要另外安裝
$ sudo apt install wireshark
在執行前先開啟 wireshark 並做一點簡單的設定
$ sudo wireshark
因為等等的實驗是跑在 localhost
,所以在首頁看到 Loopback: lo 後雙擊,我們要撈的封包會在 lo
底下出現
點進去之後我們需要先設定一下 QUIC 的 port,點選左上角 Edit → Preferences → Protocols → QUIC,看到以下界面
這邊填上 4433,下面的實驗我們都會跑在 UDP 4433 port 上面,設定完這個步驟才能把 UDP 封包識別成 QUIC 的封包
那準備完成後可以來試著撈 QUIC 封包了,現在 wireshark 在監聽 lo
的流量。
這次抓包的對象是 Day6 編譯的 ngtcp2 範例,先切換到編譯完的 examples/ 底下
$ cd /ngtcp2/examples/
如果之前有編譯成功,應該可以在這個資料夾底下看到 server
, client
兩個執行檔,請先分別開兩個視窗,並先開啟 server 後再開啟 client
在 client 的 terminal 請設定環境變數 SSLKEYLOGFILE
$ export SSLKEYLOGFILE=~/Desktop/quic/ngtcp2/examples/sslkeylog.log
延伸閱讀
這個環境變數可以讓保留 D-H 演算法交換的金鑰,因為 QUIC 封包原則上都是加密的,我們必須要額外設定這個環境變量才能正確的解密封包資料。
接著先把 Server 開啟
$ ./server 127.0.0.1 4433 server.key server.crt
再開啟 Client,等 Client 連線成功後,按下 Ctrl + c
中斷,應該會看到以下畫面
$ ./client 127.0.0.1 4433 -i
這時候在我們設定 SSLKEYLOGFILE 的路徑應該會出現 sslkeylog.log
這個檔案,裡面存有剛剛 QUIC 交互時使用的金鑰
確認後請在 wireshark 中設定,點選 Edit → Preferences → Protocols → TLS
(Pre)-Master-Secret log filename 的地方填入 sslkeylog.log
的路徑
回到 wireshark 主頁面發現剛剛的交互過程成功被紀錄下來了,記得在搜索欄位先輸入 QUIC 把所有 QUIC 的封包的篩選出來
這樣子往後就可以一邊從 code 下手,一邊用 wireshark 查看實際的 QUIC 封包怎麼運作了,明天我們會簡單介紹一下 RFC9000 中關於 Handshark 的章節,並且配合 wireshark 觀察實際的狀況。